﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity.Infrastructure;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Data.Entity.Validation;
using System.Data.Objects;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using System.Windows.Documents;

namespace WF_Office_Verwaltung
{
    public partial class frm_Kundenformular : Form
    {
        helfer_klasse aHelferKlasse = new helfer_klasse();
        nachrichten_klasse aNachrichtenKlasse = new nachrichten_klasse();
        dbCon_klasse aDbconKlasse = new dbCon_klasse();
        string sBemerkung = "Bemerkungen";

        int nQueryedKunde;
        int selectedKunde = -1;
        public frm_Kundenformular(int nQueryedKunde)
        {
            InitializeComponent();
            tabKundenverwaltung.SelectedIndex = 1;
            if (nQueryedKunde == 0)
            {
                nQueryedKunde = -1;
            }
            else if (nQueryedKunde != -1)
            {
                selectedKunde = nQueryedKunde;
                tabKundenverwaltung.SelectedIndex = 1;
            }


        }
        public frm_Kundenformular()
        {
            // TODO: Complete member initialization
        }
        bool bNeuerKunde = false;
        /// <summary>
        /// Beim ersten Aufrufen des Formulares werden in der methode tabKundenverwaltung_Enter
        /// der bindingsourceKunde die Daten source zugewiesen dabei wird die entitäten des DB modelles verwendet
        /// </summary>
        private void tabKundenverwaltung_Enter(object sender, EventArgs e)
        {
            try
            {
                if (nQueryedKunde == 0)
                {
                    if (selectedKunde != -1)
                    {
                        nQueryedKunde = selectedKunde;
                        using (var context = new project_entities())
                        {
                            bindingSourceKunde.DataSource = (from k in context.Kunden
                                                             where k.ID_Kunde == nQueryedKunde
                                                             select k).ToList<Kunde>();
                        }
                    }
                    else
                    {
                        nQueryedKunde = -1;
                    }
                }

                if (nQueryedKunde == -1)
                {
                    bindingSourceKunde.DataSource = aDbconKlasse.get_Kunde_as_List();
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Wird ein neuer Kunde angelegt oder ein bestehender Kunde verändert wird das mit einen click auf den 
        /// speicherbutton in die DB geschrieben. Dabei wird underschieden zwischen anlegen eines neuen Kunden 
        /// und das ändern eins bestehnenden Kunden
        /// </summary>
        private void speichernToolStripButton_Click(object sender, EventArgs e)
        {
            using (var context = new project_entities())
            {
                try
                {
                    //soll ein neuer Kunde angelegt werden 
                    if (bNeuerKunde)
                    {
                        bindingSourceKunde.EndEdit();

                        Kunde akt_Kunde = new Kunde();
                        akt_Kunde = (Kunde)bindingSourceKunde.Current;

                        write_Anrede_to_DB(akt_Kunde);
                        write_Kundenart_to_DB(akt_Kunde);
                        write_BevorzugtenTechniker_to_DB(akt_Kunde);
                        string s_Rechnungs_Adresse = txt_Rechnungs_Adresse.Text;
                        string s_Rechnungs_PLZ = txt_Rechnungs_PLZ.Text;
                        string s_Rechnungs_Ort = txt_Rechnungs_Ort.Text;
                        string s_Rechnungs_Name = txt_Rechnungs_Name.Text;

                        remove_null();
                        if (this.ValidateChildren(ValidationConstraints.Enabled))
                        {
                            if (akt_Kunde.Festnetz == null)
                            {
                                akt_Kunde.Festnetz = "--";
                            }
                            if (akt_Kunde.Mobil == null)
                            {
                                akt_Kunde.Mobil = "--";
                            }
                            context.Kunden.Add(akt_Kunde);
                            context.SaveChanges();

                            speicher_letzte_Wartung();
                            abgasmessungSpeichern();

                            Kunde new_Kunde = (Kunde)bindingSourceKunde.Current;

                            context.sp_insert_Rechnungs_Adresse(new_Kunde.ID_Kunde, s_Rechnungs_Adresse, s_Rechnungs_PLZ, s_Rechnungs_Ort, s_Rechnungs_Name);
                            bNeuerKunde = false;

                            aNachrichtenKlasse.InfoMessage("Neuer Kunde Erfolgreich angelegt");
                            bindingNavigatorAddNewItem.Enabled = true;
                            tsb_Abbrechen.Visible = false;
                            lblKundenNummer.Text = aHelferKlasse.kundenNr(akt_Kunde.ID_Kunde);

                            chb_Wartungsvertrag.Enabled = true;
                            chb_Abgasmessung.Enabled = true;
                            cbo_letzte_wartung.Enabled = true;
                            btn_neuesGerät.Enabled = true;
                            btnRechnungHinzufuegen.Enabled = true;
                            btnSchriftverkehr.Enabled = true;
                            btnBilderHinzfuegen.Enabled = true;
                            btn_Aktualisieren_Geräte_DGV.Enabled = true;
                            btnFilesAktualisieren.Enabled = true;

                            if (lbl_Bemerkungen.Text.EndsWith("*"))
                            {
                                string bemerkung = rtb_Bemerkungen.Rtf;
                                aDbconKlasse.save_bemerkung(bemerkung, getAktKunde());
                                lbl_Bemerkungen.Text = sBemerkung;
                            }
                        }
                        else
                        {
                            MessageBox.Show("Bitte füllen Sie zuerst alle Pflichtfelder aus. \n Diese sind mit * markiert.", "Pflichtfelder ausfüllen", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                    else
                    {
                        //soll ein bestehender Kunde verändert werden
                        // bindingSourceKunde.EndEdit();
                        Kunde up_akt_Kunde = (Kunde)bindingSourceKunde.Current;

                        write_Anrede_to_DB(up_akt_Kunde);
                        write_Kundenart_to_DB(up_akt_Kunde);
                        write_BevorzugtenTechniker_to_DB(up_akt_Kunde);

                        string s_Rechnungs_Adresse = txt_Rechnungs_Adresse.Text;
                        string s_Rechnungs_PLZ = txt_Rechnungs_PLZ.Text;
                        string s_Rechnungs_Ort = txt_Rechnungs_Ort.Text;
                        string s_Rechnungs_Name = txt_Rechnungs_Name.Text;

                        var rechnungsAdresse = (from ra in context.Rechnungs_Anschriften
                                               where ra.FK_Kunde == up_akt_Kunde.ID_Kunde
                                               select ra).ToList();
                        
                        if (ValidateChildren(ValidationConstraints.Enabled))
                        {
                            if (up_akt_Kunde.Festnetz == null)
                            {
                                up_akt_Kunde.Festnetz = "--";
                            }
                            if (up_akt_Kunde.Mobil == null)
                            {
                                up_akt_Kunde.Mobil = "--";
                            }

                            context.Kunden.Add(up_akt_Kunde);
                            DbEntityEntry entry = context.Entry(up_akt_Kunde);
                            entry.State = EntityState.Modified;

                            speicher_letzte_Wartung();

                            context.SaveChanges();
                            Kunde akt_Kunde = (Kunde)bindingSourceKunde.Current;

                            if (rechnungsAdresse.Count != 0)
                            {
                                context.sp_update_Rechnungs_Adresse(akt_Kunde.ID_Kunde, s_Rechnungs_Adresse, s_Rechnungs_PLZ, s_Rechnungs_Ort, s_Rechnungs_Name);
                            }
                            else
                            {
                                context.sp_insert_Rechnungs_Adresse(akt_Kunde.ID_Kunde, s_Rechnungs_Adresse, s_Rechnungs_PLZ, s_Rechnungs_Ort, s_Rechnungs_Name);
                            }
                            
                            aNachrichtenKlasse.InfoMessage("Änderungen wurden übernommen");
                            bindingNavigatorAddNewItem.Enabled = true;
                            tsb_Abbrechen.Visible = false;
                            lblKundenNummer.Text = aHelferKlasse.kundenNr(akt_Kunde.ID_Kunde);
                            abgasmessungSpeichern();
                            /*
                            chb_Wartungsvertrag.Enabled = true;
                            chb_Abgasmessung.Enabled = true;
                            cbo_letzte_wartung.Enabled = true;
                            btn_neuesGerät.Enabled = true;
                            btnRechnungHinzufuegen.Enabled = true;
                            btnSchriftverkehr.Enabled = true;
                            btnBilderHinzfuegen.Enabled = true;
                            btn_Aktualisieren_Geräte_DGV.Enabled = true;
                            btnFilesAktualisieren.Enabled = true;
                            */



                            if (lbl_Bemerkungen.Text.EndsWith("*"))
                            {
                                string bemerkung = rtb_Bemerkungen.Rtf;
                                aDbconKlasse.save_bemerkung(bemerkung, getAktKunde());
                                lbl_Bemerkungen.Text = sBemerkung;
                            }

                        }
                        else
                        {
                            MessageBox.Show("Bitte füllen Sie zuerst alle Pflichtfelder aus. \n Diese sind mit * markiert.", "Pflichtfelder ausfüllen", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                }
                catch (Exception ex)
                {
                    bindingNavigatorAddNewItem.Enabled = true;
                    aNachrichtenKlasse.ErrorMessage("Kundenformular \n speichernToolStripButton_Click \n\n", ex);
                }
            }
        }
        /// <summary>
        /// Helfermethode welche die Felder mit einen Wert befüllt
        /// da sonst die query nicht fuaNachrichtenKlasseitoniert.
        /// </summary>
        private void remove_null()
        {
            try
            {

                if (txt_Vorname.Text == "")
                {
                    txt_Vorname.Text = "--";
                }
                if (txt_mobil.Text == "")
                {
                    txt_mobil.Text = "--";
                }
                if (txt_festnetz.Text == "")
                {
                    txt_festnetz.Text = "--";
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }


        }
        /// <summary>
        /// hier wird der bevorzugte Techniker aus der drop box in die entsprechende attribut der aktuellen entität eingetragen
        /// in diesen fall akt_kunde.FK_Techniker_bevorzugt
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void write_BevorzugtenTechniker_to_DB(Kunde akt_Kunde)
        {
            try
            {
                akt_Kunde.FK_Techniker_Bevorzugt = int.Parse(cmb_Techniker.SelectedValue.ToString());
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        ///hier wird die art des Kunden mittels RadioButtons in die entsprechende attribut der aktuellen entität eingetragen
        /// in diesen fall akt_kunde.Firma
        /// dabei wird ein ein boolscher wert in die DB eingetragen
        /// Frima = 1
        /// Kunde = 0
        /// Privat Kunde = null
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void write_Kundenart_to_DB(Kunde akt_Kunde)
        {
            //kunde frima privatkunde

            try
            {
                if (rdb_Kunde.Checked)
                {
                    akt_Kunde.Firma = false;
                }
                else if (rdb_Firma.Checked)
                {
                    akt_Kunde.Firma = true;
                }
                else if (rdb_Privat_Kunde.Checked)
                {
                    akt_Kunde.Firma = null;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// hier wird mittels Radiobutton die Anrede des Kunden bestimmt
        /// Herr = 1
        /// Frau = 0
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void write_Anrede_to_DB(Kunde akt_Kunde)
        {
            try
            {
                if (rdb_Herr.Checked)
                {
                    akt_Kunde.Anrede = true;
                }
                else if (rdb_Frau.Checked)
                {
                    akt_Kunde.Anrede = false;
                }
                //akt_Kunde.Anrede = rdb_Herr.Checked ? true : false;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// die variable neuer kunde wird auf true gesetzt damit diese in der methode
        /// "speichernToolStripButton_Click die richtige if-zweig abarbeitet und ein neuer kunde angelegt werden kann
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
        {
            try
            {
                bNeuerKunde = true;
                using (var context = new project_entities())
                {
                    cmb_Techniker.DataSource = context.Techniker.ToList();
                    cmb_Techniker.ValueMember = "ID_Techniker";
                    cmb_Techniker.DisplayMember = "Vorname";
                    tsb_Abbrechen.Visible = true;
                    bindingNavigatorAddNewItem.Enabled = false;
                    bindingNavigatorMoveFirstItem.Enabled = false;
                    bindingNavigatorMovePreviousItem.Enabled = false;
                    bindingNavigatorPositionItem.ReadOnly = true;
                    rdb_Kunde.Checked = true;
                    rdb_Frau.Checked = true;

                    txt_Titel.Focus();

                    chb_Wartungsvertrag.Enabled = false;
                    chb_Abgasmessung.Enabled = false;
                    cbo_letzte_wartung.Enabled = false;
                    btn_neuesGerät.Enabled = false;
                    btnRechnungHinzufuegen.Enabled = false;
                    btnSchriftverkehr.Enabled = false;
                    btnBilderHinzfuegen.Enabled = false;
                    btnFilesAktualisieren.Enabled = false;
                    btn_Aktualisieren_Geräte_DGV.Enabled = false;


                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// diese mthode wird aufgerufen sobald man mittels der navigation des Bindingnavigators durch die 
        /// einzelnen Kunden naviegiert
        /// dabei werden die drei methoden für anrede, um was für einen kunden es sich handelt, bevorzugte techniker aufgerufen
        /// sowie die methode zum anzeigen der rechnungs adresse.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bindingSourceKunde_CurrentChanged(object sender, EventArgs e)
        {
            try
            {
                if (!Convert.ToString(sender.GetType()).Contains("BindingNavigator"))
                {
                    Kunde akt_Kunde = (Kunde)bindingSourceKunde.Current;
                    if (lbl_Bemerkungen.Text.EndsWith("*"))
                    {
                        DialogResult diaresult = aNachrichtenKlasse.Warnmessage("Es gibt noch ungespeicherte Inhalte.\nWollen Sie die Änderungern Speichern, klicken Sie OK");
                        if (diaresult == DialogResult.OK)
                        {
                            fillcmb_Techniker(akt_Kunde);
                            selectAnrede(akt_Kunde);
                            selectKundenArt(akt_Kunde);
                            displayRechnungsAdresse(akt_Kunde);
                            checkWartungsvertrag(akt_Kunde);
                            checkletzteWartung(akt_Kunde);
                            getGeräteToKunden(akt_Kunde);
                            getUploadFile(akt_Kunde.ID_Kunde);
                            lblKundenNummer.Text = aHelferKlasse.kundenNr(akt_Kunde.ID_Kunde);
                            getAbgasmessung(akt_Kunde);

                            rtb_Bemerkungen.Rtf = aDbconKlasse.get_bemerkung(akt_Kunde);
                            lbl_Bemerkungen.Text = sBemerkung;

                        }
                    }
                    else
                    {
                        fillcmb_Techniker(akt_Kunde);
                        selectAnrede(akt_Kunde);
                        selectKundenArt(akt_Kunde);
                        displayRechnungsAdresse(akt_Kunde);
                        checkWartungsvertrag(akt_Kunde);
                        checkletzteWartung(akt_Kunde);
                        getGeräteToKunden(akt_Kunde);
                        getUploadFile(akt_Kunde.ID_Kunde);
                        lblKundenNummer.Text = aHelferKlasse.kundenNr(akt_Kunde.ID_Kunde);
                        getAbgasmessung(akt_Kunde);


                        rtb_Bemerkungen.Rtf = aDbconKlasse.get_bemerkung(akt_Kunde);
                        lbl_Bemerkungen.Text = sBemerkung;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular : bindingSourceKunde_CurrentChanged\n\n", ex);
            }
        }
        /// <summary>
        /// Holt den Gültig bis wert aus der DB 
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void getAbgasmessung(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    int kundenID = akt_Kunde.ID_Kunde;
                    var abgasmessung = (from a in context.Abgasmessungen
                                        where a.FK_Kunde == kundenID
                                        select a).ToList();

                    if (abgasmessung.Count != 0)
                    {
                        setAbgasmessung(abgasmessung);
                    }
                    else
                    {
                        chb_Abgasmessung.Checked = false;

                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular : getAbgasmessung\n", ex);
            }
        }
        /// <summary>
        /// gültig bis wert aus DB wird in MM && YYYY der
        /// dazugehörigen drop down felder gespeichert
        /// </summary>
        /// <param name="abgasmessung"></param>
        private void setAbgasmessung(List<Abgasmessung> abgasmessung)
        {
            chb_Abgasmessung.Checked = true;
            cbAbgasmessungJahr.Visible = true;
            cbAbgasmessungMonat.Visible = true;


            string monat = abgasmessung[0].Gültig_bis.Month.ToString();
            string jahr = abgasmessung[0].Gültig_bis.Year.ToString();
            if (int.Parse(monat) < 10)
            {
                monat = "0" + monat;
            }

            cbAbgasmessungMonat.SelectedItem = monat;
            cbAbgasmessungJahr.SelectedItem = jahr;
        }
        /// <summary>
        /// ermittelt den Aktuellen kunden und gibt ein Kunden object zurück
        /// </summary>
        /// <returns>Kundenobjekt</returns>
        internal Kunde getAktKunde()
        {
            try
            {
                Kunde k_akt_Kunde = (Kunde)bindingSourceKunde.Current;
                return k_akt_Kunde;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular : getAktKunde\n", ex);
                return null;
            }
        }
        /// <summary>
        /// Holt sich die zu dem gehörigen Datein des Kunden
        /// </summary>
        /// <param name="akt_Kunde"></param>
        internal void getUploadFile(int akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var pdf = (from p in context.BLOB_OBJECTS
                               where p.FK_Kunde == akt_Kunde && p.Pdf == true
                               select new
                               {
                                   Namen = p.Name,
                                   Datum = p.Datum
                               }).ToList();
                    if (pdf != null)
                    {
                        dgvRechnungen.DataSource = pdf;
                    }

                    var jpg = (from j in context.BLOB_OBJECTS
                               where j.FK_Kunde == akt_Kunde && j.Pdf == false
                               select new
                               {
                                   Name = j.Name,
                                   Datum = j.Datum
                               }).ToList();
                    if (jpg != null)
                    {
                        dgvBilder.DataSource = jpg;
                    }
                    var txt = (from j in context.BLOB_OBJECTS
                               where j.FK_Kunde == akt_Kunde && j.Pdf == null
                               select new
                               {
                                   Name = j.Name,
                                   Datum = j.Datum
                               }).ToList();
                    if (txt != null)
                    {
                        dgvSchriftverkehr.DataSource = txt;
                    }
                }

            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// befüllt die dgv welche die geräte type und FD# anzeigt
        /// </summary>
        /// <param name="akt_Kunde"></param>
        internal void getGeräteToKunden(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var geräte = (from g in context.Geräte
                                  where g.FK_ID_Kunde == akt_Kunde.ID_Kunde
                                  select new
                                  {
                                      Gerätetyp = g.Bezeichnung,
                                      FDNR = g.FD_NR,
                                      Zubehör = g.Art,
                                      Id = g.ID_Gerät
                                  }).ToList();
                    if (geräte != null)
                    {
                        dgv_Geräte.DataSource = geräte;
                        dgv_Geräte.Columns[0].Width = 240;
                        dgv_Geräte.Columns[2].Width = 300;
                        dgv_Geräte.Columns[1].HeaderText = "FD-NR";
                    }

                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// checked ob es eine Wartung OHNE Vertrag gibt 
        /// </summary>
        /// <param name="akt_Kunde"></param>
        DateTime letzteWartungValue = DateTime.Parse("01.01.1000");
        private void checkletzteWartung(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var letzte_Wartung = context.sp_get_letzter_Wartungsvertrag(akt_Kunde.ID_Kunde).ToList();
                    DateTime dtLetzteWartung = DateTime.Parse("01.01.1000");
                    /*int j = 0;
                    for (int i = 0; i < letzte_Wartung.Count; i++)
                    {
                       
                        if (!letzte_Wartung[i].Gelöscht && j == 0)
                        {
                            sLetzteWartung = letzte_Wartung[i].letzte_wartung.ToString();
                            j++;
                        }
                    }*/
                    dtLetzteWartung = aHelferKlasse.letzteWartung(akt_Kunde.ID_Kunde);

                    if (dtLetzteWartung != DateTime.Parse("01.01.1000"))
                    {
                        if (chb_Wartungsvertrag.Checked)
                        {
                            dtp_letzte_wartung.Visible = true;
                            dtp_letzte_wartung.Enabled = false;
                            cbo_letzte_wartung.Checked = true;
                            dtp_letzte_wartung.Value = dtLetzteWartung;

                        }
                        else
                        {
                            dtp_letzte_wartung.Visible = true;
                            dtp_letzte_wartung.Enabled = true;
                            cbo_letzte_wartung.Checked = true;
                            dtp_letzte_wartung.Value = dtLetzteWartung;
                        }
                    }
                    else
                    {
                        int aktKunde = getAktKunde().ID_Kunde;
                        var letzteWartung = (from l in context.letzte_Wartung
                                             where l.FK_Kunde == aktKunde
                                             orderby l.letzte_wartung descending
                                             select l).Take(1).ToList();
                        if (letzteWartung.Count() != 0)
                        {
                            letzteWartungValue = letzteWartung[0].letzte_wartung;

                            dtp_letzte_wartung.Visible = true;
                            dtp_letzte_wartung.Enabled = true;

                            dtp_letzte_wartung.Value = letzteWartungValue;
                            cbo_letzte_wartung.Checked = true;

                        }
                        else
                        {
                            dtp_letzte_wartung.Visible = false;
                            cbo_letzte_wartung.Checked = false;

                        }

                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular: checkletzteWartung\n", ex);
            }
        }
        /// <summary>
        /// hier wird festgestellt ob der Kunde einen/mehrere WV's besitzt 
        /// ist das der Fall nimmt die checkbox den zustand checked an und der Button "Details"
        /// letzte Wartungs Datums feld wird enabled
        /// wird enabled
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void checkWartungsvertrag(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var WV = context.sp_check_for_WV(akt_Kunde.ID_Kunde).ToList();
                    if (WV.Count != 0)
                    {
                        chb_Wartungsvertrag.Checked = true;
                        btn_Wartungsvertrag_Details.Enabled = true;
                    }
                    else
                    {
                        chb_Wartungsvertrag.Checked = false;
                        btn_Wartungsvertrag_Details.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// aus der DB  werden die Daten zum anzeigen der Rechnungs adresse geladen.
        /// der verwendete value dabei ist die ID des Kunden
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void displayRechnungsAdresse(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    bindingSourceRechnungsAdresse.DataSource = (from ra in context.Rechnungs_Anschriften
                                                                where ra.FK_Kunde == akt_Kunde.ID_Kunde
                                                                select ra).ToList<Rechnungs_Anschrift>();
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Kundenart wird ausgewählt und in die entität akt_kunde geschrieben
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void selectKundenArt(Kunde akt_Kunde)
        {
            try
            {
                bool? firma;
                firma = akt_Kunde.Firma;
                if (firma == true)
                {
                    //ddb_Kundenart.SelectedIndex = 2;
                    rdb_Firma.Checked = true;
                }
                else if (firma == false)
                {
                    //ddb_Kundenart.SelectedIndex = 1;
                    rdb_Kunde.Checked = true;
                }
                else if (firma == null)
                {
                    //ddb_Kundenart.SelectedIndex = 3;
                    rdb_Privat_Kunde.Checked = true;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// in der methode wird die anrede selectiert welche im forumlar dargestellt werden
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void selectAnrede(Kunde akt_Kunde)
        {
            try
            {
                if (akt_Kunde.Anrede)
                {
                    rdb_Herr.Checked = true;
                }
                else
                {
                    rdb_Frau.Checked = true;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
                throw;
            }
        }
        /// <summary>
        /// in der methode wird der bevorzugte techniker ausgewählt und an das steuerelement (dropbox) im formular
        /// übergeben
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void fillcmb_Techniker(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    cmb_Techniker.DataSource = context.Techniker.ToList();
                    cmb_Techniker.ValueMember = "ID_Techniker";
                    cmb_Techniker.DisplayMember = "Vorname";

                    var bevorzugterTechniker = (from t in context.Techniker
                                                where t.ID_Techniker == akt_Kunde.FK_Techniker_Bevorzugt
                                                select t.Vorname).ToList<string>();

                    if (bevorzugterTechniker.Count != 0)
                    {
                        string techniker_Name = bevorzugterTechniker[0].ToString();
                        cmb_Techniker.Text = techniker_Name;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// im ersten schritt wird überprüft ob der sender der diese methode auslöst die checkbox für die suche nach rechnungsnummern ist
        /// der checked zustand des elements cb_rechnugns_nummer wird überprüft
        /// wenn eines der textboxen mit text befüllt sind wird wein warnhinweis aufgerufen 
        /// ist das nicht der fall wird die textbox für die rechnungsnummer sofort aktiv geschalten
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void search_form_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (sender == cb_Rechnungs_nummer)
                {
                    if (cb_Rechnungs_nummer.Checked)
                    {
                        if (txt_search_Vorname.Text != "" || txt_search_Nachname.Text != "" || txt_search_PLZ.Text != "" || txt_search_Ort.Text != "" || txt_search_Adresse.Text != "" || txt_search_Tele.Text != "" || txt_search_Festnetz.Text != "")
                        {
                            zeige_Mbox();
                        }
                        else
                        {
                            aktiviere_RechnungsNr_Suche();
                        }
                    }
                    else
                    {
                        txt_search_Rechnung.Enabled = false;
                        txt_search_Rechnung.Text = "";
                        txt_search_Vorname.Enabled = true;
                        txt_search_Nachname.Enabled = true;
                        txt_search_PLZ.Enabled = true;
                        txt_search_Ort.Enabled = true;
                        txt_search_Adresse.Enabled = true;
                        txt_search_Tele.Enabled = true;
                        txt_search_Festnetz.Enabled = true;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// die methode wird aufgerugen wenn der check zustand der cb_rechnungs_nummer true ist und in einen der anderen txtboxen ein wert steht.
        /// die textbox wird als warnung mit einem OK und Cancel Button aufgerufen.
        /// wird der OK butten geclickt wird der eine methode aufgerufen 
        /// wird der cancel button geclickt wird die ganze aktion abgebrochen und alles ist so wie vorher.
        /// </summary>
        private void zeige_Mbox()
        {
            try
            {
                DialogResult diaResult = aNachrichtenKlasse.Warnmessage("Alle vorasugefüllten Textfelder werden geleert. Wollen Sie das wirklich?");

                if (diaResult == DialogResult.OK)
                {
                    aktiviere_RechnungsNr_Suche();
                }
                else if (diaResult == DialogResult.Cancel)
                {
                    cb_Rechnungs_nummer.Checked = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);


            }
        }
        /// <summary>
        /// wird beim warnhinweis der mbox ok geclickt oder aber waren alle textboxen leer 
        /// wird diese methode aufgerufen. 
        /// dabei werden alle textboxen geleert und inaktiv geschalten. 
        /// textbox rechnungsnummer wird aktiviert
        /// </summary>
        private void aktiviere_RechnungsNr_Suche()
        {
            try
            {
                txt_search_Rechnung.Enabled = true;
                txt_search_Vorname.Text = "";
                txt_search_Nachname.Text = "";
                txt_search_PLZ.Text = "";
                txt_search_Ort.Text = "";
                txt_search_Adresse.Text = "";
                txt_search_Tele.Text = "";
                txt_search_Festnetz.Text = "";

                txt_search_Vorname.Enabled = false;
                txt_search_Nachname.Enabled = false;
                txt_search_PLZ.Enabled = false;
                txt_search_Ort.Enabled = false;
                txt_search_Adresse.Enabled = false;
                txt_search_Tele.Enabled = false;
                txt_search_Festnetz.Enabled = false;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// wird nach dem click auf den Button Suchen ausgelöst
        /// hilfvariablen werden angelegt 
        /// hilfsvariablen bekommen den wert übergeben der in der textbox steht, hat diese keinen wert 
        /// wird der wert der variable auf null gesetzt.
        /// mit den hilfvariablen wird die stored procedure aufgerufen
        /// die werte die zurück kommen werden in der Datagridview dargestellt.
        /// 
        /// Hat der User die option gewählt nach rechnungsnummern zu suchen 
        /// wird diese direkt an die stored procedure übergeben. 
        /// und das ergebnis wird in der Datagridview dargestellt.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_suchen_Click(object sender, EventArgs e)
        {
            try
            {
                DB_suche_parametriesiert();   
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        private void search_field_Enter_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                DB_suche_parametriesiert();
            }
        }
        private void DB_suche_parametriesiert() 
        {
            try
            {
                using (var context = new project_entities())
                {

                    if (!cb_Rechnungs_nummer.Checked)
                    {
                        string vorname, nachname, PLZ, ort, adresse, mobil, festnetz;
                        #region query_parameter
                        #region vorname
                        if (txt_search_Vorname.Text != "")
                        {
                            vorname = txt_search_Vorname.Text;
                        }
                        else
                        {
                            vorname = null;
                        }
                        #endregion
                        #region nachname
                        if (txt_search_Nachname.Text != "")
                        {
                            nachname = txt_search_Nachname.Text;
                        }
                        else
                        {
                            nachname = null;
                        }
                        #endregion
                        #region PLZ
                        if (txt_search_PLZ.Text != "")
                        {
                            PLZ = txt_search_PLZ.Text;
                        }
                        else
                        {
                            PLZ = null;
                        }
                        #endregion
                        #region Ort
                        if (txt_search_Ort.Text != "")
                        {
                            ort = txt_search_Ort.Text;
                        }
                        else
                        {
                            ort = null;
                        }
                        #endregion
                        #region Adresse
                        if (txt_search_Adresse.Text != "")
                        {
                            adresse = txt_search_Adresse.Text;
                        }
                        else
                        {
                            adresse = null;
                        }
                        #endregion
                        #region Mobil
                        if (txt_search_Tele.Text != "")
                        {
                            mobil = txt_search_Tele.Text;
                        }
                        else
                        {
                            mobil = null;
                        }
                        #endregion
                        #region Festnetz
                        if (txt_search_Festnetz.Text != "")
                        {
                            festnetz = txt_search_Festnetz.Text;
                        }
                        else
                        {
                            festnetz = null;
                        }
                        #endregion
                        #region Kunden_ID
                        int? id_kunde = null;

                        if (txt_search_KundenID.Text != "")
                        {
                            // TODO : sp um Kunden ID erweitern und mit dieser Aufrufen
                            string nKundenId = txt_search_KundenID.Text;
                            id_kunde = int.Parse(nKundenId);
                        }
                        else
                        {
                            id_kunde = null;
                        }
                        #endregion
                        #endregion
                        var search_result = context.sp_search_Kunde(vorname, nachname, PLZ, ort, adresse, mobil, festnetz, id_kunde).ToList();
                        dgv_search_result.DataSource = search_result;
                        dgv_search_result.Columns[0].Width = 140;
                        dgv_search_result.Columns[1].Width = 160;
                        dgv_search_result.Columns[2].Width = 60;
                        dgv_search_result.Columns[4].Width = 175;
                        dgv_search_result.Columns[4].DisplayIndex = 2;
                        dgv_search_result.Columns[7].DisplayIndex = 0;
                        dgv_search_result.Columns[7].HeaderText = "Kunden Nr.";
                        dgv_search_result.Columns[7].Width = 130;

                        btn_serach_Refresh.Visible = true;
                    }
                    else
                    {
                        var q_rechnung = context.sp_search_Rechnungs_Nummer(txt_search_Rechnung.Text).ToList();
                        dgv_search_result.DataSource = q_rechnung;
                        btn_serach_Refresh.Visible = true;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular  : DB_suche_parametrisiert", ex);
            }
        }
        /// <summary>
        /// Behandelt den double click auf das Suchergebnis in der DataGridView 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgv_search_result_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                int cur_index = dgv_search_result.CurrentRow.Index;

                nQueryedKunde = int.Parse(dgv_search_result.Rows[dgv_search_result.CurrentRow.Index].Cells["ID_Kunde"].Value.ToString());
                tabKundenverwaltung.SelectedIndex = 1;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// Beim wechseln der Tabs werden durch diese Methode die daten neu geladen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tabKundenverwaltung_Selected(object sender, TabControlEventArgs e)
        {
            try
            {
                if (nQueryedKunde != -1)
                {
                    if (selectedKunde != -1)
                    {
                        nQueryedKunde = selectedKunde;
                    }
                    using (var context = new project_entities())
                    {
                        bindingSourceKunde.DataSource = (from k in context.Kunden
                                                         where k.ID_Kunde == nQueryedKunde
                                                         select k).ToList<Kunde>();
                    }
                    nQueryedKunde = -1;
                }
                else
                {
                    using (var context = new project_entities())
                    {
                        bindingSourceKunde.DataSource = (from k in context.Kunden
                                                         select k).ToList<Kunde>();
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);

            }
        }
        /// <summary>
        /// refreshed die such ansicht
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_serach_Refresh_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult aDialogResult = aNachrichtenKlasse.Warnmessage("Soll das Ergebnis wirklich zurückgesetzt werde?");

                if (aDialogResult == DialogResult.OK)
                {
                    txt_search_Vorname.Text = "";
                    txt_search_Nachname.Text = "";
                    txt_search_PLZ.Text = "";
                    txt_search_Ort.Text = "";
                    txt_search_Adresse.Text = "";
                    txt_search_Tele.Text = "";
                    txt_search_Festnetz.Text = "";
                    dgv_search_result.DataSource = null;
                    btn_serach_Refresh.Visible = false;
                }

            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Validierung für das Kundenformular
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Validating_Kundenformular(object sender, CancelEventArgs e)
        {
            try
            {
                if (sender == txt_Nachname)
                {
                    erp_Kunde.SetError(txt_Nachname, "");

                    e.Cancel = string.IsNullOrEmpty(txt_Nachname.Text);
                    if (e.Cancel)
                    {
                        erp_Kunde.SetError(txt_Nachname, "Der Kunde braucht einen Nachnamen");
                    }
                    else
                    {
                        erp_Kunde.SetError(txt_Nachname, "");
                    }
                }
                else if (sender == txt_Adresse)
                {
                    erp_Kunde.SetError(txt_Adresse, "");

                    e.Cancel = string.IsNullOrEmpty(txt_Adresse.Text);
                    if (e.Cancel)
                    {
                        erp_Kunde.SetError(txt_Adresse, "Der Kunde braucht einen Adresse");
                    }
                    else
                        erp_Kunde.SetError(txt_Adresse, "");
                }
                else if (sender == txt_PLZ)
                {
                    erp_Kunde.SetError(txt_PLZ, "");

                    int i = 0;
                    e.Cancel = !int.TryParse(txt_PLZ.Text, out i);
                    if (e.Cancel)
                    {
                        erp_Kunde.SetError(txt_PLZ, "Die Adresse des Kunden braucht einen PLZ, \ndiese ist vierstellig und beinhaltet nur Zahen (z.B.: 1010)");
                    }
                    else
                        erp_Kunde.SetError(txt_PLZ, "");
                }
                else if (sender == txt_ort)
                {
                    erp_Kunde.SetError(txt_ort, "");

                    e.Cancel = string.IsNullOrEmpty(txt_ort.Text);
                    if (e.Cancel)
                    {
                        erp_Kunde.SetError(txt_ort, "Der Kunde braucht einen Ort");
                    }
                    else
                        erp_Kunde.SetError(txt_ort, "");
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Öffnet das Wartungsformular mit den Aktuellen kunden und zeigt alle Wartungsverträge eines Kunden an
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Wartungsvertrag_Details_Click(object sender, EventArgs e)
        {
            try
            {
                Kunde _akt_Kunde = new Kunde();
                _akt_Kunde = (Kunde)bindingSourceKunde.Current;

                int akt_Kunde = _akt_Kunde.ID_Kunde;
                Wartungsvertragformular frm_WV_Formular = new Wartungsvertragformular(akt_Kunde);
                frm_WV_Formular.Show();
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Enabled oder disabled den Butten um Wartungsverträge anzulegen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chb_Wartungsvertrag_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chb_Wartungsvertrag.Checked)
                {
                    btn_Wartungsvertrag_Details.Enabled = true;
                }
                else
                {
                    btn_Wartungsvertrag_Details.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// Aktiviert das letzte wartungs DateTime feld und den Speicher button
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbo_letzte_wartung_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbo_letzte_wartung.Checked)
                {
                    if (chb_Wartungsvertrag.Checked)
                    {
                        dtp_letzte_wartung.Visible = true;
                        dtp_letzte_wartung.Enabled = false;
                    }
                    else
                    {
                        dtp_letzte_wartung.Visible = true;
                        dtp_letzte_wartung.Enabled = true;
                        if (letzteWartungValue == DateTime.Parse("01.01.1000"))
                        {
                            dtp_letzte_wartung.Value = DateTime.Now;
                        }
                        else 
                        {
                            dtp_letzte_wartung.Value = letzteWartungValue;

                        }
                    }
                }
                else
                {
                    dtp_letzte_wartung.Visible = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// hier werden die letzte wartung gespeicher (in die DatenbaaNachrichtenKlasse geschrieben)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void speicher_letzte_Wartung()
        {
            if (getAktKunde() != null && cbo_letzte_wartung.Checked)
            {
                try
                {
                    using (var context = new project_entities())
                    {
                        try
                        {
                            DateTime dt_letzte_Wartung = dtp_letzte_wartung.Value;
                            int akt_Kunde = getAktKunde().ID_Kunde;
                            context.sp_insert_letzte_Wartung(dt_letzte_Wartung, akt_Kunde);
                        }
                        catch (Exception ex)
                        {
                            aNachrichtenKlasse.ErrorMessage("Kundenformular : btn_Speicher_letzte_Wartung_Click\n", ex);
                        }
                    }
                }
                catch (Exception ex)
                {
                    aNachrichtenKlasse.ErrorMessage("Kundenformular : btn_Speicher_letzte_Wartung_Click\n", ex);
                }
            }
        }
        /// <summary>
        /// wird das Focus leave event aus der rtb Bemerkung aufgerufen wird der DB aufruf abgewickelt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rtb_Bemerkungen_Leave(object sender, EventArgs e)
        {
            try
            {
                if (lbl_Bemerkungen.Text.EndsWith("*"))
                {
                    string bemerkung = rtb_Bemerkungen.Rtf;
                    aDbconKlasse.save_bemerkung(bemerkung, getAktKunde());
                    lbl_Bemerkungen.Text = sBemerkung;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular.cs /n rtb_Bemerkung_Leave /n/n", ex);
            }
        }
        /// <summary>
        /// bemerkung wird gespeichert bevor der kunde gewechselt wird
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bindingNavigatorMoveNextItem_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                if (this.ValidateChildren(ValidationConstraints.Enabled))
                {
                    if (lbl_Bemerkungen.Text.EndsWith("*"))
                    {
                        string bemerkung = rtb_Bemerkungen.Rtf;
                        aDbconKlasse.save_bemerkung(bemerkung, getAktKunde());
                        lbl_Bemerkungen.Text = sBemerkung;
                    }
                }
                else
                {
                    MessageBox.Show("Bitte füllen Sie zuerst alle Pflichtfelder aus. \n Diese sind mit * markiert.", "Pflichtfelder ausfüllen", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular.cs /n rtb_Bemerkung_Leave /n/n", ex);
            }
        }
        /// <summary>
        /// wird der Text im Bemerkungsfeld geändert wird die möglicaHelferKlasseeit zum speichern freigeschalten 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rtb_Bemerkungen_TextChanged(object sender, EventArgs e)
        {
            if (!lbl_Bemerkungen.Text.EndsWith("*"))
            {
                if (rtb_Bemerkungen.Text != "")
                {
                    lbl_Bemerkungen.Text = lbl_Bemerkungen.Text + "*";
                }
            }
        }
        /// <summary>
        /// Neuer Kunde anlegen Abbrechen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsb_Abbrechen_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult aDialogResult = aNachrichtenKlasse.Warnmessage("Sind Sie sicher das die änderungen verworfen werden sollen?");
                if (aDialogResult == DialogResult.OK)
                {
                    if (nQueryedKunde == -1)
                    {
                        bindingSourceKunde.DataSource = aDbconKlasse.get_Kunde_as_List();
                    }
                    tsb_Abbrechen.Visible = false;

                    bindingNavigatorAddNewItem.Enabled = true;
                    bindingNavigatorMoveFirstItem.Enabled = true;
                    bindingNavigatorMovePreviousItem.Enabled = true;
                    bindingNavigatorPositionItem.ReadOnly = false;
                    bNeuerKunde = false;
                    chb_Wartungsvertrag.Enabled = true;
                    chb_Abgasmessung.Enabled = true;
                    cbo_letzte_wartung.Enabled = true;
                    btn_neuesGerät.Enabled = true;
                    btnRechnungHinzufuegen.Enabled = true;
                    btnSchriftverkehr.Enabled = true;
                    btnBilderHinzfuegen.Enabled = true;
                    btn_Aktualisieren_Geräte_DGV.Enabled = true;
                    btnFilesAktualisieren.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// behandelt das Save event des speicherbuttons bei der geräte dgv
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_NeuesGerät(object sender, EventArgs e)
        {
            Kunde _akt_Kunde = new Kunde();
            _akt_Kunde = (Kunde)bindingSourceKunde.Current;
            string geräteID = "-1";
            int akt_Kunde = _akt_Kunde.ID_Kunde;
            neuesGerät frm_Neues_Gerät = new neuesGerät(geräteID, akt_Kunde);
            frm_Neues_Gerät.Show();
            getGeräteToKunden(getAktKunde());
        }
        /// <summary>
        /// Öffnet das Geräte Formular mit dem Ausgewählten Formular
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgv_Geräte_DoubleClick(object sender, EventArgs e)
        {
            string geräteId = dgv_Geräte.Rows[dgv_Geräte.CurrentRow.Index].Cells["ID"].Value.ToString();
            neuesGerät ng = new neuesGerät(geräteId, getAktKunde().ID_Kunde);
            ng.ShowDialog();
        }
        /// <summary>
        /// aktualisiert die dgv welche die Geräte information anzeigt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Aktualisieren_Geräte_DGV_Click(object sender, EventArgs e)
        {
            Kunde akt_Kunde = getAktKunde();
            getGeräteToKunden(akt_Kunde);
        }
        /// <summary>
        /// Öffnet das FileUploadformular
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBilderHinzfuegen_Click(object sender, EventArgs e)
        {
            string upLoadArt = "JPG";
            frmFileUpload fileUpload = new frmFileUpload(upLoadArt, getAktKunde().ID_Kunde);
            fileUpload.Show();
        }
        /// <summary>
        /// Öffnet das FileUploadformular
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSchriftverkehr_Click(object sender, EventArgs e)
        {
            string upLoadArt = "TXT";
            frmFileUpload fileUpload = new frmFileUpload(upLoadArt, getAktKunde().ID_Kunde);
            fileUpload.Show();
        }
        /// <summary>
        /// Öffnet das FileUploadformular
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRechnungHinzufuegen_Click(object sender, EventArgs e)
        {
            string upLoadArt = "PDF";
            frmFileUpload fileUpload = new frmFileUpload(upLoadArt, getAktKunde().ID_Kunde);
            fileUpload.Show();
        }
        /// <summary>
        /// Triggered den Download von Objekten die in Rechnungs DGV dagestellet werden 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvRechnungen_DoubleClick(object sender, EventArgs e)
        {
            var dbRechnung = dgvRechnungen.Rows[dgvRechnungen.CurrentRow.Index].Cells[1].Value;

            DateTime date = DateTime.Parse(dbRechnung.ToString());
            string newDBFile = createDate(date);
            int akt_Kunde = getAktKunde().ID_Kunde;
            frm_löschen_download loadForm = new frm_löschen_download(newDBFile, akt_Kunde);
            loadForm.ShowDialog();
        }
        /// <summary>
        /// Triggered den Download von Objekten die in Bilder DGV dagestellet werden 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvBilder_DoubleClick(object sender, EventArgs e)
        {
            var dbBilder = dgvBilder.Rows[dgvBilder.CurrentRow.Index].Cells[1].Value;
            DateTime date = DateTime.Parse(dbBilder.ToString());
            string newDBFile = createDate(date);
            int akt_Kunde = getAktKunde().ID_Kunde;
            frm_löschen_download loadForm = new frm_löschen_download(newDBFile, akt_Kunde);
            loadForm.ShowDialog();

        }
        /// <summary>
        /// Triggered den Download von Objekten die in der Schriftverkehr DGV dagestellet werden 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvSchriftverkehr_DoubleClick(object sender, EventArgs e)
        {
            var dbSchriftstück = dgvSchriftverkehr.Rows[dgvSchriftverkehr.CurrentRow.Index].Cells[1].Value;
            DateTime date = DateTime.Parse(dbSchriftstück.ToString());
            string newDBFile = createDate(date);
            int akt_Kunde = getAktKunde().ID_Kunde;
            frm_löschen_download loadForm = new frm_löschen_download(newDBFile, akt_Kunde);
            loadForm.ShowDialog();
        }
        /// <summary>
        /// Download der ausgewählten Objekte
        /// </summary>
        /// <param name="dbFile"> Datum der ausgewählten Datei</param>
        internal void getFileViaFilestream(string dbFile, int akt_Kunde)
        {
            SqlConnection conn = aDbconKlasse.getConnection();
            try
            {
                conn.Open();
                SqlCommand sqlCmd = aDbconKlasse.getCommandSelectBLOB_OBJECT(akt_Kunde, dbFile, conn);

                if (sqlCmd != null)
                {
                    SqlDataAdapter objAdapter = new SqlDataAdapter(sqlCmd);
                    DataTable objTable = new DataTable();
                    DataRow objRow;
                    objAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                    SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(objAdapter);
                    objAdapter.Fill(objTable);
                    objRow = objTable.Rows[0];

                    byte[] objData = (byte[])objRow["BLOB_OBJECT"];
                    string temp = Path.GetTempPath();
                    string path = temp + objRow["Name"];
                    FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
                    fs.Write(objData, 0, objData.Length);
                    fs.Close();

                    Process process = new Process();
                    process.StartInfo = new ProcessStartInfo(path);
                    process.Start();
                }
                else
                {
                    aNachrichtenKlasse.InfoMessage("Ein unerwarteter Fehler ist aufgetreten, versuchen Sie es zu einem späteren Zeitpunkt erneut.");
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// Erstelle das Datumsformat welches benötigt wird um via getFileViaFilestream die Dateien downzuloaden
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        private string createDate(DateTime date)
        {
            string newDate = "";
            string month = date.Month.ToString();
            string day = date.Day.ToString();
            string hour = date.Hour.ToString();
            string min = date.Minute.ToString();
            string sec = date.Second.ToString();
            if (date.Month < 10)
            {
                month = "0" + month;
            }
            if (date.Day < 10)
            {
                day = "0" + day;
            }
            if (date.Hour < 10)
            {
                hour = "0" + hour;
            }
            if (date.Minute < 10)
            {
                min = "0" + min;
            }
            if (date.Second < 10)
            {
                sec = "0" + sec;
            }
            newDate = date.Year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec;

            return newDate;
        }
        /// <summary>
        /// Aktualisiert die DGV's 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFilesAktualisieren_Click(object sender, EventArgs e)
        {
            getUploadFile(getAktKunde().ID_Kunde);
        }
        /// <summary>
        /// Überprüft den Status der Abgassmessung
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chb_Abgasmessung_CheckedChanged(object sender, EventArgs e)
        {
            try
            {

                if (chb_Abgasmessung.Checked)
                {
                    using (var context = new project_entities())
                    {
                        int kundenID = getAktKunde().ID_Kunde;
                        var abgasmessung = (from a in context.Abgasmessungen
                                            where a.FK_Kunde == kundenID
                                            select a).ToList();

                        if (abgasmessung.Count == 0)
                        {
                            cbAbgasmessungJahr.Visible = true;
                            cbAbgasmessungMonat.Visible = true;
                            cbAbgasmessungMonat.SelectedItem = "";
                            cbAbgasmessungJahr.SelectedItem = "";
                        }
                        else
                        {
                            setAbgasmessung(abgasmessung);
                        }

                    }
                }
                else
                {
                    cbAbgasmessungJahr.Visible = false;
                    cbAbgasmessungMonat.Visible = false;
                }

            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenfromular : chb_Abgasmessung_CheckedChanged\n", ex);
                throw;
            }
        }
        /// <summary>
        /// Speichert die Abgasmessung in die Datenbank
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void abgasmessungSpeichern()
        {
            try
            {
                if (getAktKunde() != null && chb_Abgasmessung.Checked)
                {
                    string monat = cbAbgasmessungMonat.SelectedItem.ToString();
                    string jahr = cbAbgasmessungJahr.SelectedItem.ToString();
                    string datum = "01/" + monat + "/" + jahr;
                    DateTime gültigBis = Convert.ToDateTime(datum);

                    gültigBis = DateTime.Parse("01-" + monat + "-" + jahr);

                    using (var context = new project_entities())
                    {
                        int kundenId = getAktKunde().ID_Kunde;
                        var abgasMessung = (from a in context.Abgasmessungen
                                            where a.FK_Kunde == kundenId
                                            select a).ToList();
                        if (abgasMessung.Count == 0)
                        {
                            Abgasmessung messung = new Abgasmessung();
                            messung.FK_Kunde = getAktKunde().ID_Kunde;
                            messung.Geprüft_am = DateTime.Now;
                            messung.Gültig_bis = gültigBis;
                            context.Abgasmessungen.Add(messung);
                            context.SaveChanges();
                        }
                        else
                        {
                            int abgasmessungId = abgasMessung[0].ID_Abgasmessung;
                            Abgasmessung messung = context.Abgasmessungen.First(i => i.FK_Kunde == kundenId);
                            messung.FK_Kunde = kundenId;
                            messung.Geprüft_am = DateTime.Now;
                            messung.Gültig_bis = gültigBis;
                            context.SaveChanges();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular : btnAbgasmessungSpeichern_Click\n", ex);
            }
        }
        private void frm_Kundenformular_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = false;
        }
        private void speichernToolStripButton1_Click(object sender, EventArgs e)
        {
            try
            {
                if (lbl_Bemerkungen.Text.EndsWith("*"))
                {
                    string bemerkung = rtb_Bemerkungen.Rtf;
                    aDbconKlasse.save_bemerkung(bemerkung, getAktKunde());
                    lbl_Bemerkungen.Text = sBemerkung;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular.cs /n speichernToolStripButton1_Click /n/n", ex);
            }

        }
        private void tp_Ausschneiden_Click(object sender, EventArgs e)
        {
            cut();
        }
        private void tp_Kopieren_Click(object sender, EventArgs e)
        {
            copy();
        }
        private void tp_Einfügen_Click(object sender, EventArgs e)
        {
            past();
        }
        private void tp_Bold_Click(object sender, EventArgs e)
        {
            Font bFont = new Font(rtb_Bemerkungen.Font, FontStyle.Bold);
            Font rFont = new Font(rtb_Bemerkungen.Font, FontStyle.Regular);

            if (rtb_Bemerkungen.SelectedText.Length == 0)
            {
                return;
            }
            if (rtb_Bemerkungen.SelectionFont.Bold)
            {
                rtb_Bemerkungen.SelectionFont = rFont;
            }
            else
            {
                rtb_Bemerkungen.SelectionFont = bFont;
            }
        }
        private void tp_Italic_Click(object sender, EventArgs e)
        {
            Font iFont = new Font(rtb_Bemerkungen.Font, FontStyle.Italic);
            Font rFont = new Font(rtb_Bemerkungen.Font, FontStyle.Regular);

            if (rtb_Bemerkungen.SelectedText.Length == 0)
            {
                return;
            }
            if (rtb_Bemerkungen.SelectionFont.Italic)
            {
                rtb_Bemerkungen.SelectionFont = rFont;
            }
            else
            {
                rtb_Bemerkungen.SelectionFont = iFont;
            }
        }
        private void tp_Underline_Click(object sender, EventArgs e)
        {
            Font uFont = new Font(rtb_Bemerkungen.Font, FontStyle.Underline);
            Font rFont = new Font(rtb_Bemerkungen.Font, FontStyle.Regular);

            if (rtb_Bemerkungen.SelectedText.Length == 0)
            {
                return;
            }
            if (rtb_Bemerkungen.SelectionFont.Underline)
            {
                rtb_Bemerkungen.SelectionFont = rFont;
            }
            else
            {
                rtb_Bemerkungen.SelectionFont = uFont;
            }
        }
        private void tp_Durchstreichen_Click(object sender, EventArgs e)
        {
            Font sFont = new Font(rtb_Bemerkungen.Font, FontStyle.Strikeout);
            Font rFont = new Font(rtb_Bemerkungen.Font, FontStyle.Regular);

            if (rtb_Bemerkungen.SelectedText.Length == 0)
            {
                return;
            }
            if (rtb_Bemerkungen.SelectionFont.Strikeout)
            {
                rtb_Bemerkungen.SelectionFont = rFont;
            }
            else
            {
                rtb_Bemerkungen.SelectionFont = sFont;
            }
        }
        private void ts_fontcolor_Click(object sender, EventArgs e)
        {
            SolidBrush brush = new SolidBrush(Color.Black);
            DialogResult result = new DialogResult();
            ColorDialog CD = new ColorDialog();

            result = CD.ShowDialog();
            if (result == DialogResult.OK)
            {
                brush.Color = CD.Color;
            }

            Font rFont = new Font(rtb_Bemerkungen.Font, FontStyle.Regular);

            if (rtb_Bemerkungen.SelectedText.Length == 0)
            {
                return;
            }
            else
            {
                rtb_Bemerkungen.SelectionColor = brush.Color;
            }


        }
        public void cut()
        {
            rtb_Bemerkungen.Cut();
        }
        public void copy()
        {
            rtb_Bemerkungen.Copy();
        }
        public void past()
        {
            rtb_Bemerkungen.Paste();
        }

    }
}
